/*
 This file 'browser' is part of Firebird Integrated Solution 1.0

 Copyright (c) 2018 Lincong

 Contact:  
        Email: lincong1987@gmail.com

        QQ: 159257119
 
 See Usage at http://www.jplatformx.com/firebird

 Create date: 2018-06-22 16:39
 */


(function (root, factory) {
	// if (typeof define === 'function' && (define.amd||define.cmd)) {
	// 	// AMD&CMD
	// 	define(factory);
	// } else if (typeof exports === 'object') {
	// 	// Node, CommonJS-like
	// 	module.exports = factory();
	// } else {
	// 	// Browser globals (root is window)
	// 	root.Browser = factory();
	// }

	define(function (require, exports, module) {
		module.exports = factory();
	});

}(this, function () {
	var _window = this || {};
	var _navigator = typeof navigator != 'undefined' ? navigator : {};
	var _mime = function (option, value) {
		var mimeTypes = navigator.mimeTypes;
		for (var mt in mimeTypes) {
			if (mimeTypes[mt][option] == value) {
				return true;
			}
		}
		return false;
	};

	return function (userAgent) {
		var u = userAgent || _navigator.userAgent || {};
		var _this = this;

		_this.platform = _navigator.platform;


		_this.platformArch = (function () {
			var uaProduct = navigator.userAgent.split(" ")[0];
			var ua = uaProduct.length > 0 ? navigator.userAgent.replace(uaProduct, "") : navigator.userAgent;

			if (ua.match("(Win64|IA64|AMD64|x64|x86_64|WOW64)") !== null) {
				return "x86-64";
			}

			if (ua.match("(PPC|Mac_PowerPC)") !== null) {
				return "PPC";
			}

			if (ua.match("sun4") !== null) {
				return "SPARC";
			}

			//The default arch should be assumed 32bit x86
			return "x86-32";
		})();

		_this.browserArch = (function () {
			var uaProduct = navigator.userAgent.split(" ")[0];
			var ua = uaProduct.length > 0 ? navigator.userAgent.replace(uaProduct, "") : navigator.userAgent;

			if (ua.match("(Win64|IA64|AMD64|x64|x86_64)") !== null) {
				return "x86-64";
			}

			return "x86-32";
		})();

		var match = {
			//内核
			'Trident': u.indexOf('Trident') > -1 || u.indexOf('NET CLR') > -1,
			'Presto': u.indexOf('Presto') > -1,
			'WebKit': u.indexOf('AppleWebKit') > -1,
			'Gecko': u.indexOf('Gecko/') > -1,
			//浏览器
			'Safari': u.indexOf('Safari') > -1,
			'Chrome': u.indexOf('Chrome') > -1 || u.indexOf('CriOS') > -1,
			'IE': u.indexOf('MSIE') > -1 || u.indexOf('Trident') > -1,
			'Edge': u.indexOf('Edge') > -1,
			'Firefox': u.indexOf('Firefox') > -1 || u.indexOf('FxiOS') > -1,
			'Firefox Focus': u.indexOf('Focus') > -1,
			'Chromium': u.indexOf('Chromium') > -1,
			'Opera': u.indexOf('Opera') > -1 || u.indexOf('OPR') > -1,
			'Vivaldi': u.indexOf('Vivaldi') > -1,
			'Yandex': u.indexOf('YaBrowser') > -1,
			'Arora': u.indexOf('Arora') > -1,
			'Lunascape': u.indexOf('Lunascape') > -1,
			'QupZilla': u.indexOf('QupZilla') > -1,
			'Coc Coc': u.indexOf('coc_coc_browser') > -1,
			'Kindle': u.indexOf('Kindle') > -1 || u.indexOf('Silk/') > -1,
			'Iceweasel': u.indexOf('Iceweasel') > -1,
			'Konqueror': u.indexOf('Konqueror') > -1,
			'Iceape': u.indexOf('Iceape') > -1,
			'SeaMonkey': u.indexOf('SeaMonkey') > -1,
			'Epiphany': u.indexOf('Epiphany') > -1,
			'360': u.indexOf('QihooBrowser') > -1,
			'360EE': u.indexOf('360EE') > -1,
			'360SE': u.indexOf('360SE') > -1,
			'UC': u.indexOf('UC') > -1 || u.indexOf(' UBrowser') > -1,
			'QQBrowser': u.indexOf('QQBrowser') > -1,
			'QQ': u.indexOf('QQ/') > -1,
			'Baidu': u.indexOf('Baidu') > -1 || u.indexOf('BIDUBrowser') > -1,
			'Maxthon': u.indexOf('Maxthon') > -1,
			'Sogou': u.indexOf('MetaSr') > -1 || u.indexOf('Sogou') > -1,
			'LBBROWSER': u.indexOf('LBBROWSER') > -1,
			'2345Explorer': u.indexOf('2345Explorer') > -1,
			'TheWorld': u.indexOf('TheWorld') > -1,
			'XiaoMi': u.indexOf('MiuiBrowser') > -1,
			'Quark': u.indexOf('Quark') > -1,
			'Qiyu': u.indexOf('Qiyu') > -1,
			'Wechat': u.indexOf('MicroMessenger') > -1,
			'Taobao': u.indexOf('AliApp(TB') > -1,
			'Alipay': u.indexOf('AliApp(AP') > -1,
			'Weibo': u.indexOf('Weibo') > -1,
			'Douban': u.indexOf('com.douban.frodo') > -1,
			'Suning': u.indexOf('SNEBUY-APP') > -1,
			'iQiYi': u.indexOf('IqiyiApp') > -1,
			//系统或平台
			'Windows': u.indexOf('Windows') > -1,
			'Linux': u.indexOf('Linux') > -1 || u.indexOf('X11') > -1,
			'Mac OS': u.indexOf('Macintosh') > -1,
			'Android': u.indexOf('Android') > -1 || u.indexOf('Adr') > -1,
			'Ubuntu': u.indexOf('Ubuntu') > -1,
			'FreeBSD': u.indexOf('FreeBSD') > -1,
			'Debian': u.indexOf('Debian') > -1,
			'Windows Phone': u.indexOf('IEMobile') > -1 || u.indexOf('Windows Phone') > -1,
			'BlackBerry': u.indexOf('BlackBerry') > -1 || u.indexOf('RIM') > -1,
			'MeeGo': u.indexOf('MeeGo') > -1,
			'Symbian': u.indexOf('Symbian') > -1,
			'iOS': u.indexOf('like Mac OS X') > -1,
			'Chrome OS': u.indexOf('CrOS') > -1,
			'WebOS': u.indexOf('hpwOS') > -1,
			//设备
			'Mobile': u.indexOf('Mobi') > -1 || u.indexOf('iPh') > -1 || u.indexOf('480') > -1,
			'Tablet': u.indexOf('Tablet') > -1 || u.indexOf('Pad') > -1 || u.indexOf('Nexus 7') > -1
		};
		var is360 = false;
		if (_window.chrome) {
			var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1');
			if (chrome_vision > 36 && _window.showModalDialog) {
				is360 = true;
			} else if (chrome_vision > 45) {
				is360 = _mime("type", "application/vnd.chromium.remoting-viewer");
			}
		}
		//修正
		if (match['Mobile']) {
			match['Mobile'] = !(u.indexOf('iPad') > -1);
		} else if (is360) {
			if (_mime("type", "application/gameplugin")) {
				match['360SE'] = true;
			} else {
				match['360EE'] = true;
			}
		}
		if (match['IE'] || match['Edge']) {
			var navigator_top = window.screenTop - window.screenY;
			switch (navigator_top) {
				case 71: //无收藏栏,贴边
				case 74: //无收藏栏,非贴边
				case 99: //有收藏栏,贴边
				case 102: //有收藏栏,非贴边
					match['360EE'] = true;
					break;
				case 75: //无收藏栏,贴边
				case 74: //无收藏栏,非贴边
				case 105: //有收藏栏,贴边
				case 104: //有收藏栏,非贴边
					match['360SE'] = true;
					break;
			}
		}
		//基本信息
		var hash = {
			engine: ['WebKit', 'Trident', 'Gecko', 'Presto'],
			browser: ['Safari', 'Chrome', 'Edge', 'IE', 'Firefox', 'Firefox Focus', 'Chromium', 'Opera', 'Vivaldi', 'Yandex', 'Arora', 'Lunascape', 'QupZilla', 'Coc Coc', 'Kindle', 'Iceweasel', 'Konqueror', 'Iceape', 'SeaMonkey', 'Epiphany', '360', '360SE', '360EE', 'UC', 'QQBrowser', 'QQ', 'Baidu', 'Maxthon', 'Sogou', 'LBBROWSER', '2345Explorer', 'TheWorld', 'XiaoMi', 'Quark', 'Qiyu', 'Wechat', 'Taobao', 'Alipay', 'Weibo', 'Douban', 'Suning', 'iQiYi'],
			os: ['Windows', 'Linux', 'Mac OS', 'Android', 'Ubuntu', 'FreeBSD', 'Debian', 'iOS', 'Windows Phone', 'BlackBerry', 'MeeGo', 'Symbian', 'Chrome OS', 'WebOS'],
			device: ['Mobile', 'Tablet']
		};
		_this.device = 'PC';
		_this.language = (function () {
			var g = (_navigator.browserLanguage || _navigator.language);
			var arr = g.split('-');
			if (arr[1]) {
				arr[1] = arr[1].toUpperCase();
			}
			return arr.join('_');
		})();
		for (var s in hash) {
			for (var i = 0; i < hash[s].length; i++) {
				var value = hash[s][i];
				if (match[value]) {
					_this[s] = value;
				}
			}
		}
		//系统版本信息
		var osVersion = {
			'Windows': function () {
				var v = u.replace(/^.*Windows NT ([\d.]+);.*$/, '$1');
				var hash = {
					'6.4': '10',
					'6.3': '8.1',
					'6.2': '8',
					'6.1': '7',
					'6.0': 'Vista',
					'5.2': 'XP',
					'5.1': 'XP',
					'5.0': '2000'
				};
				return hash[v] || v;
			},
			'Android': function () {
				return u.replace(/^.*Android ([\d.]+);.*$/, '$1');
			},
			'iOS': function () {
				return u.replace(/^.*OS ([\d_]+) like.*$/, '$1').replace(/_/g, '.');
			},
			'Debian': function () {
				return u.replace(/^.*Debian\/([\d.]+).*$/, '$1');
			},
			'Windows Phone': function () {
				return u.replace(/^.*Windows Phone( OS)? ([\d.]+);.*$/, '$2');
			},
			'Mac OS': function () {
				return u.replace(/^.*Mac OS X ([\d_]+).*$/, '$1').replace(/_/g, '.');
			},
			'WebOS': function () {
				return u.replace(/^.*hpwOS\/([\d.]+);.*$/, '$1');
			}
		};
		_this.osVersion = '';
		if (osVersion[_this.os]) {
			_this.osVersion = osVersion[_this.os]();
			if (_this.osVersion == u) {
				_this.osVersion = '';
			}
		}
		//浏览器版本信息
		var version = {
			'Safari': function () {
				return u.replace(/^.*Version\/([\d.]+).*$/, '$1');
			},
			'Chrome': function () {
				return u.replace(/^.*Chrome\/([\d.]+).*$/, '$1').replace(/^.*CriOS\/([\d.]+).*$/, '$1');
			},
			'IE': function () {
				return u.replace(/^.*MSIE ([\d.]+).*$/, '$1').replace(/^.*rv:([\d.]+).*$/, '$1');
			},
			'Edge': function () {
				return u.replace(/^.*Edge\/([\d.]+).*$/, '$1');
			},
			'Firefox': function () {
				return u.replace(/^.*Firefox\/([\d.]+).*$/, '$1').replace(/^.*FxiOS\/([\d.]+).*$/, '$1');
			},
			'Firefox Focus': function () {
				return u.replace(/^.*Focus\/([\d.]+).*$/, '$1');
			},
			'Chromium': function () {
				return u.replace(/^.*Chromium\/([\d.]+).*$/, '$1');
			},
			'Opera': function () {
				return u.replace(/^.*Opera\/([\d.]+).*$/, '$1').replace(/^.*OPR\/([\d.]+).*$/, '$1');
			},
			'Vivaldi': function () {
				return u.replace(/^.*Vivaldi\/([\d.]+).*$/, '$1');
			},
			'Yandex': function () {
				return u.replace(/^.*YaBrowser\/([\d.]+).*$/, '$1');
			},
			'Arora': function () {
				return u.replace(/^.*Arora\/([\d.]+).*$/, '$1');
			},
			'Lunascape': function () {
				return u.replace(/^.*Lunascape[\/\s]([\d.]+).*$/, '$1');
			},
			'QupZilla': function () {
				return u.replace(/^.*QupZilla[\/\s]([\d.]+).*$/, '$1');
			},
			'Coc Coc': function () {
				return u.replace(/^.*coc_coc_browser\/([\d.]+).*$/, '$1');
			},
			'Kindle': function () {
				return u.replace(/^.*Version\/([\d.]+).*$/, '$1');
			},
			'Iceweasel': function () {
				return u.replace(/^.*Iceweasel\/([\d.]+).*$/, '$1');
			},
			'Konqueror': function () {
				return u.replace(/^.*Konqueror\/([\d.]+).*$/, '$1');
			},
			'Iceape': function () {
				return u.replace(/^.*Iceape\/([\d.]+).*$/, '$1');
			},
			'SeaMonkey': function () {
				return u.replace(/^.*SeaMonkey\/([\d.]+).*$/, '$1');
			},
			'Epiphany': function () {
				return u.replace(/^.*Epiphany\/([\d.]+).*$/, '$1');
			},
			'360': function () {
				return u.replace(/^.*QihooBrowser\/([\d.]+).*$/, '$1');
			},
			'360SE': function () {
				var hash = {'55': '9.1', '45': '8.1', '42': '8.0', '31': '7.0', '21': '6.3'};
				var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1');
				return hash[chrome_vision] || '';
			},
			'360EE': function () {
				var hash = {'63': '9.5', '55': '9.0', '50': '8.7', '30': '7.5'};
				var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1');
				return hash[chrome_vision] || '';
			},
			'Maxthon': function () {
				return u.replace(/^.*Maxthon\/([\d.]+).*$/, '$1');
			},
			'QQBrowser': function () {
				return u.replace(/^.*QQBrowser\/([\d.]+).*$/, '$1');
			},
			'QQ': function () {
				return u.replace(/^.*QQ\/([\d.]+).*$/, '$1');
			},
			'Baidu': function () {
				return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/, '$1');
			},
			'UC': function () {
				return u.replace(/^.*UC?Browser\/([\d.]+).*$/, '$1');
			},
			'Sogou': function () {
				return u.replace(/^.*SE ([\d.X]+).*$/, '$1').replace(/^.*SogouMobileBrowser\/([\d.]+).*$/, '$1');
			},
			'LBBROWSER': function () {
				var hash = {
					'57': '6.5',
					'49': '6.0',
					'46': '5.9',
					'42': '5.3',
					'39': '5.2',
					'34': '5.0',
					'29': '4.5',
					'21': '4.0'
				};
				var chrome_vision = navigator.userAgent.replace(/^.*Chrome\/([\d]+).*$/, '$1');
				return hash[chrome_vision] || '';
			},
			'2345Explorer': function () {
				return u.replace(/^.*2345Explorer\/([\d.]+).*$/, '$1');
			},
			'TheWorld': function () {
				return u.replace(/^.*TheWorld ([\d.]+).*$/, '$1');
			},
			'XiaoMi': function () {
				return u.replace(/^.*MiuiBrowser\/([\d.]+).*$/, '$1');
			},
			'Quark': function () {
				return u.replace(/^.*Quark\/([\d.]+).*$/, '$1');
			},
			'Qiyu': function () {
				return u.replace(/^.*Qiyu\/([\d.]+).*$/, '$1');
			},
			'Wechat': function () {
				return u.replace(/^.*MicroMessenger\/([\d.]+).*$/, '$1');
			},
			'Taobao': function () {
				return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/, '$1');
			},
			'Alipay': function () {
				return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/, '$1');
			},
			'Weibo': function () {
				return u.replace(/^.*weibo__([\d.]+).*$/, '$1');
			},
			'Douban': function () {
				return u.replace(/^.*com.douban.frodo\/([\d.]+).*$/, '$1');
			},
			'Suning': function () {
				return u.replace(/^.*SNEBUY-APP([\d.]+).*$/, '$1');
			},
			'iQiYi': function () {
				return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/, '$1');
			}
		};
		_this.version = '';
		if (version[_this.browser]) {
			_this.version = version[_this.browser]();
			if (_this.version == u) {
				_this.version = '';
			}
		}
		//修正
		if (_this.browser == 'Edge') {
			_this.engine = 'EdgeHTML';
		} else if (_this.browser == 'Chrome' && parseInt(_this.version) > 27) {
			_this.engine = 'Blink';
		} else if (_this.browser == 'Opera' && parseInt(_this.version) > 12) {
			_this.engine = 'Blink';
		} else if (_this.browser == 'Yandex') {
			_this.engine = 'Blink';
		}
	};
}));